package modelx

import (
	"database/sql"
	"errors"
	"fmt"
	"time"

	"github.com/volatiletech/sqlboiler/v4/boil"
)

type Mysql struct {
	Host          string // 服务器地址
	Port          int    `json:",default=3306"`                                               // 端口
	Config        string `json:",default=charset%3Dutf8mb4%26parseTime%3Dtrue%26loc%3DLocal"` // 高级配置
	DBName        string // 数据库名
	Username      string // 数据库用户名
	Password      string // 数据库密码
	MaxIdleConns  int    `json:",default=10"`                               // 空闲中的最大连接数
	MaxOpenConns  int    `json:",default=10"`                               // 打开到数据库的最大连接数
	SlowThreshold int64  `json:",default=1000"`
}

func (m *Mysql) Dsn() string {
	return m.Username + ":" + m.Password + "@tcp(" + m.Host + ":" + fmt.Sprintf("%d", m.Port) + ")/" + m.DBName + "?" + m.Config
}

func (m *Mysql) GetSlowThreshold() time.Duration {
	return time.Duration(m.SlowThreshold) * time.Millisecond
}

func ConnectMysql(m Mysql) (*sql.DB, error) {
	if m.DBName == "" {
		return nil, errors.New("database name is empty")
	}

	db, err := sql.Open("mysql", m.Dsn())
	if err != nil {
		// err: could not open database connection
		return nil, err
	}

	boil.DebugMode = true

	// https://www.alexedwards.net/blog/configuring-sqldb
	db.SetMaxOpenConns(m.MaxOpenConns)
	db.SetMaxIdleConns(m.MaxIdleConns)
	db.SetConnMaxLifetime(5 * time.Minute)

	if err = db.Ping(); err != nil {
		// err: no real database connection
		return nil, err
	}

	return db, nil
}
